package org.sample.dining.order;

import org.sample.dining.AbstractChopstick;

/**
 * Created by alan on 2017/7/12.
 * 该解法，每次优先取编号最小的筷子
 * 假设为哲学家和筷子分配编号p1-p5 & c1-c5，
 * 根据规则，哲学家p1~p4将持有筷子c1~c4
 * 而哲学家p5需要取较小编号写的c1，但c1已经被p1占用
 * 因此筷子c5将会被p1获得，p1将会用餐
 */
public class Chopstick extends AbstractChopstick {

    public Chopstick(int index) {
        super(index);
    }

    @Override
    public synchronized boolean take() {
        while (!available)
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        available = false;
        return true;
    }

    @Override
    public synchronized void drop() {
        available = true;
        this.notifyAll();
    }
}